Certificate Validation এবং Bypassing Self-signed Certificates

Java Technologies - অ্যাপাচি এইচটিটিপি ক্লায়েন্ট (Apache HTTP Client) SSL/TLS এবং Secure Communication |
163
163

অ্যাপাচি HTTP ক্লায়েন্ট (Apache HTTP Client) ব্যবহার করে Certificate Validation এবং Self-signed Certificates বাইপাস করা একটি গুরুত্বপূর্ণ বিষয়, বিশেষ করে নিরাপদ (HTTPS) যোগাযোগের ক্ষেত্রে। স্বাক্ষরিত সার্টিফিকেটের মাধ্যমে HTTPS সংযোগ নিরাপদ করা হয়, কিন্তু কিছু সময়ে ডেভেলপমেন্ট পরিবেশে বা অন্যান্য পরিস্থিতিতে Self-signed certificates (যেগুলি ট্রাস্টেড সার্টিফিকেট অথরিটি দ্বারা সই করা হয় না) ব্যবহার করা হয়। এই সার্টিফিকেটগুলি সাধারণত নিরাপত্তা সতর্কতা সৃষ্টি করে।

এই ধরনের পরিস্থিতিতে Certificate Validation এবং Bypassing Self-signed Certificates করতে হয়, যা HTTP ক্লায়েন্টের জন্য কাস্টম SSLContext কনফিগারেশন প্রয়োজন।

Certificate Validation

সাধারণভাবে, HTTPS সংযোগ স্থাপন করার সময় সার্ভারের সার্টিফিকেট যাচাই করা হয়। HttpClient সার্টিফিকেট যাচাইয়ের জন্য ডিফল্টভাবে Java keystore (JKS) বা প্ল্যাটফর্মের ট্রাস্টস্টোর ব্যবহার করে।

Self-signed Certificates বাইপাস করা

Self-signed certificates বাইপাস করার জন্য, SSLContext কনফিগার করতে হয় যাতে সার্টিফিকেট যাচাই করা না হয়।

কোড উদাহরণ: Self-signed Certificate বাইপাস করা

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;

public class ApacheHttpClientCertificateValidation {
    public static void main(String[] args) {
        try {
            // SSLContext কাস্টমাইজ করা (Self-signed সার্টিফিকেট বাইপাস)
            TrustManager[] trustAllCertificates = new TrustManager[]{
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                    public void checkClientTrusted(X509Certificate[] certs, String authType) {
                    }
                    public void checkServerTrusted(X509Certificate[] certs, String authType) {
                    }
                }
            };

            // SSLContext তৈরি করুন এবং TrustManager যোগ করুন
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustAllCertificates, new java.security.SecureRandom());

            // HttpClient তৈরি করুন, SSLContext ও HostnameVerifier বাইপাস করুন
            CloseableHttpClient httpClient = HttpClients.custom()
                    .setSSLContext(sslContext)
                    .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                    .build();

            // GET অনুরোধ তৈরি করুন
            HttpGet httpGet = new HttpGet("https://self-signed.badssl.com/");

            // অনুরোধ পাঠান এবং প্রতিক্রিয়া সংগ্রহ করুন
            CloseableHttpResponse response = httpClient.execute(httpGet);

            try {
                // প্রতিক্রিয়া স্ট্যাটাস কোড পড়ুন
                int statusCode = response.getStatusLine().getStatusCode();
                System.out.println("Response Status Code: " + statusCode);

                // HttpEntity থেকে ডেটা পড়ুন
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    String responseBody = EntityUtils.toString(entity);
                    System.out.println("Response Content: " + responseBody);
                }
            } finally {
                response.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

কোড ব্যাখ্যা

  1. SSLContext কনফিগার করা

    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, trustAllCertificates, new java.security.SecureRandom());
    
    • SSLContext.getInstance("TLS") ব্যবহার করে একটি SSLContext অবজেক্ট তৈরি করা হয়।
    • এখানে, TrustManager কাস্টম তৈরি করা হয়েছে, যা সার্টিফিকেট যাচাই করে না এবং সব সার্টিফিকেটকেই গ্রহণ করে।
  2. TrustManager

    TrustManager[] trustAllCertificates = new TrustManager[]{
        new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }
    };
    
    • X509TrustManager কাস্টমাইজ করা হয়েছে যাতে সার্টিফিকেট যাচাইয়ের কোনো কাজ না করে এবং সমস্ত সার্টিফিকেটকে গ্রহণ করে।
  3. HostnameVerifier বাইপাস

    .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
    
    • NoopHostnameVerifier.INSTANCE ব্যবহার করে হোস্টনেম যাচাই বাইপাস করা হয়েছে, যার ফলে হোস্টনেমের সাথে সম্পর্কিত কোনো সতর্কতা বা ত্রুটি প্রদর্শিত হবে না।
  4. HttpClient তৈরি করা

    CloseableHttpClient httpClient = HttpClients.custom()
            .setSSLContext(sslContext)
            .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
            .build();
    
    • কাস্টম SSLContext এবং HostnameVerifier সহ একটি HttpClient তৈরি করা হয়েছে।
  5. GET অনুরোধ এবং প্রতিক্রিয়া সংগ্রহ
    • httpClient.execute(httpGet) ব্যবহার করে GET অনুরোধ পাঠানো হয়েছে এবং সার্ভারের প্রতিক্রিয়া পাওয়া হয়েছে।

Security Warning

যদিও self-signed certificates বা সার্টিফিকেট যাচাই বাইপাস করার কৌশলগুলি ডেভেলপমেন্ট বা পরীক্ষার সময় কার্যকর হতে পারে, তা বাস্তব প্রোডাকশন পরিবেশে নিরাপত্তা ঝুঁকি তৈরি করতে পারে। এটি SSL/TLS সংযোগের নিরাপত্তাকে দুর্বল করে ফেলে, কারণ আপনি সার্ভারের সার্টিফিকেট যাচাই করছেন না। এর ফলে Man-in-the-Middle (MITM) আক্রমণ হতে পারে, যেখানে আক্রমণকারী সংযোগে হস্তক্ষেপ করতে পারে।

সারাংশ

Self-signed certificates বাইপাস করা এবং Certificate Validation কাস্টমাইজ করা Apache HTTP Client এর মাধ্যমে সহজেই সম্ভব, তবে এটি শুধুমাত্র ডেভেলপমেন্ট বা পরীক্ষার ক্ষেত্রে ব্যবহার করা উচিত। প্রোডাকশন পরিবেশে ট্রাস্টেড সার্টিফিকেট অথরিটি দ্বারা স্বাক্ষরিত সার্টিফিকেট ব্যবহার করা উচিৎ।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion